home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / business / pcprojct.zip / PROJECT.ZOO / act / proj.act next >
Text File  |  1990-04-14  |  7KB  |  269 lines

  1. /* proj.act       --miscelaneous methods, initializations
  2. */
  3.  
  4. /* globals for application colors */
  5. Actor[#CritColor]:=RED;
  6. Actor[#SlackColor]:=BLUE;
  7. !!
  8.  
  9. /* globals for conditional compilation during debugging etc */
  10.  
  11. Actor[#Debug] := false;     /* debugging enable/disable */
  12. Actor[#Trace] := false;     /* trace recalc calls */      
  13. Actor[#CurPos] := 0;        /* text dump of network uses this */ 
  14. !!
  15.  
  16. /* methods for system classes */
  17.  
  18. now(Window)!!
  19.  
  20. /* Set the current cursor position in client coords.
  21.    This is useful when implementing a keyboard interface. */
  22. Def  setCursorPos(self, pos | scrnPos)
  23.   scrnPos := clientToScreen(self, pos);
  24.   Call SetCursorPos(scrnPos.x, scrnPos.y);
  25. }!!
  26.  
  27. /* Return a point of the current cursor position in client coords.
  28.    This is useful when implementing a keyboard interface. */
  29. Def  getCursorPos(self | struct, scrnPos, lpr)
  30.   struct := new(Struct,4);          /* to store the point */
  31.   lpr := lP(struct);                /* long pointer */
  32.   Call GetCursorPos(lpr);           /* device coords */
  33.   scrnPos := pointAt(lpr);          /* get the data */
  34.   freeHandle(struct);               /* free up memory */
  35.   ^screenToClient(self, scrnPos);   /* screen coords */
  36. }!!
  37.  
  38. /* Return a point giving the text width and height
  39.    in the given display context. 
  40.    e.g. for system font the return value might be 
  41.    8@15 for 8 pixels wide, 15 high, depending on the
  42.    Windows drivers. */
  43. Def  textSize(self, hDC | tm1, tm2)
  44.   tm1 := new(Struct, 31);            /* to hold the info */
  45.   Call GetTextMetrics(hDC, lP(tm1)); /* call Windows fn */
  46.   tm2 := getData(tm1);               /* get the data back */
  47.   freeHandle(tm1);                   /* free up memory */
  48.   ^point(low(tm2[10]), low(tm2[0])); /* width@height */
  49. }!!
  50.  
  51.  
  52. now(TextWindow)!!
  53.  
  54. /* Print a line in a TextWindow. */
  55. Def printLine(self, str)
  56. {
  57.   printString(self, str);
  58.   eol(self);
  59. }!!
  60.  
  61.  
  62. now(Dialog);!!
  63.  
  64. /* Run the dialog with the appropriate resource
  65.    and parent.  Display a warning if it fails. */
  66. Def  checkRunModal(self, res, parent | retValue)
  67. {
  68.   retValue := runModal(self, res, parent);
  69.   if retValue == NOMEM
  70.     beep();
  71.     errorBox(loadString(PW_WARNING),
  72.              loadString(PW_ERRMEM1) + CR_LF +
  73.              loadString(PW_ERRMEM2));
  74.   endif;
  75.   ^retValue;
  76. }!!
  77.  
  78. now(String);!!
  79.  
  80. /* Return the string in a field of fieldSize.
  81.    Truncate or pad with blanks as necessary.
  82. */
  83. Def  field(self, fieldSize | size)
  84. {
  85.   if fieldSize < size := size(self)
  86.     ^subString(self, 0, fieldSize)            /* truncate */
  87.   else
  88.     ^self + stringOf(' ', fieldSize - size);  /* pad */
  89.   endif;
  90. }!!
  91.  
  92. /* Convert to decimal.  Safe if length = 0. */
  93. Def  asDec(self)
  94. {
  95.   if size(self) = 0
  96.     ^ 0;
  97.   else
  98.     ^asInt(self,10);
  99.   endif;
  100. }!!
  101.  
  102. /* Show a yesNoBox with self as the caption, str as message.  
  103.    Return value of 6 = IDYES, 7 = IDNO. */
  104. Def yesNoBox(self, str)
  105. {  ^new(ErrorBox, ThePort, str, self, 4);
  106. }!!
  107.  
  108. /* Convert a string into a Date object.
  109.    Use the international string format.  
  110.    Return nil if not a valid date. */
  111. Def asIntlDate(self | sep, format, ints, posn, pos1, pos2, mm, dd, yy)
  112. { sep := getProfileString(System, "intl", "sDate");
  113.   if sep = "" then sep := "/"; endif;
  114.   format := getProfileString(System, "intl", "iDate");
  115.   select
  116.     case format = "2"
  117.       posn := #(2 0 1); /* YYMMDD */
  118.     endCase
  119.     case format = "1"
  120.       posn := #(1 0 2); /* DDMMYY */
  121.     endCase
  122.     default       
  123.       posn := #(0 1 2); /* MMDDYY */
  124.   endSelect;
  125.   ints := new(Array, 3);
  126.   pos1 := find(self, sep, 0);
  127.   if not(pos1) ^nil; endif;
  128.   ints[0] := asDec(subString(self, 0, pos1));  
  129.   pos2 := find(self, sep, pos1+1);
  130.   if not(pos2) ^nil; endif;
  131.   ints[1] := asDec(subString(self, pos1+1, pos2));
  132.   ints[2] := asDec(subString(self, pos2+1, size(self)));
  133.   mm := ints[posn[0]];  dd := ints[posn[1]];  yy := ints[posn[2]];
  134.   if not(mm) cor mm > 12 cor mm < 1 ^nil; endif;
  135.   if not(dd) cor dd > 31 cor dd < 1 ^nil; endif;
  136.   if not(yy) cor yy < 0 ^nil; endif;
  137.   if yy < 100 yy := yy + 1900; endif;
  138.   ^date(mm, dd, yy);
  139. }!!
  140.  
  141. /* Report an error if the date string is invalid,
  142.    otherwise return the Date object.  Ignore empty strings.
  143.    Report the error according to international date format. */
  144. Def  checkDate(self | retValue, iDate, format)
  145.   if self <> ""
  146.   cand not(retValue := asIntlDate(self))
  147.     beep();
  148.     iDate := getProfileString(System, "intl", "iDate");
  149.     select
  150.       case iDate = "2"
  151.         format := loadString(PW_YYMMDD);
  152.       endCase
  153.       case iDate = "1"
  154.         format := loadString(PW_DDMMYY);
  155.       endCase
  156.       default                               /* "0" or unspecified */
  157.         format := loadString(PW_MMDDYY);
  158.     endSelect;
  159.     errorBox(loadString(PW_ERRDATE1),
  160.              asString(self) + loadString(PW_ERRDATE2) + format +
  161.              loadString(PW_ERRDATE3));
  162.   endif;
  163.   ^retValue;
  164. }!!
  165.  
  166.  
  167. now(Date)!!
  168.  
  169. /* Modify the asString method to use intl format. */
  170. Def asString(self)
  171. {
  172.   ^asIntlString(self);
  173. }!!
  174.  
  175. /* Convert a date to a string.  NilClass:checkString
  176.    returns an empty string. */
  177. Def  checkString(self)
  178.   ^asString(self);
  179. }!!
  180.  
  181.  
  182. /* Return date in international string format. 
  183.    Abbreviate the year.  */
  184. Def asIntlString(self | sep, form, da, yr)
  185.   sep := getProfileString(System, "intl", "sDate");
  186.   if sep = "" sep := "/"; endif;
  187.   form := getProfileString(System, "intl", "iDate");
  188.   da := asDateArray(self); 
  189.   if da[2] > 1900
  190.     yr := subString(asString(da[2]), 2, 4);
  191.   else
  192.     yr := asString(da[2]);
  193.   endif;
  194.   select
  195.     case form = "2" /* YYMMDD */
  196.      ^yr+sep+asString(da[1])+sep+asString(da[0]);
  197.     endCase
  198.     case form = "1" /* DDMMYY */
  199.      ^asString(da[1])+sep+asString(da[0])+sep+yr;
  200.     endCase
  201.     default         /* MMDDYY */
  202.      ^asString(da[0])+sep+asString(da[1])+sep+yr;
  203.     endSelect;
  204. }!!
  205.  
  206.  
  207. now(Int)!!
  208.  
  209. /* Create a date object with a starting value. */
  210. Def date(self, dd, yy)
  211. {
  212.   ^date(new(Date), self, dd, yy);
  213. }!!
  214.  
  215.  
  216. now(NilObject)!!
  217.  
  218. /* Return an empty string.  For compatibility
  219.    with the Date class so you can checkString(nil)
  220.    or checkString(aDate) and get a string. */
  221. Def  checkString(self)
  222.   ^"";
  223. }!!
  224.  
  225.  
  226. now(Collection)!!
  227.  
  228. /* Returns true (the position) if the elem is in the collection.
  229.    Uses a sequential search.  Descendent classes redefine this
  230.    using more efficient means where possible. */
  231. Def  in(self, elem)
  232. {
  233.   do(size(self),
  234.     {using(i) 
  235.      if self[i] = elem ^i; endif;   /* found */
  236.   });
  237.   ^false;    /* not found */
  238. }!!
  239.  
  240.  
  241. now(Dictionary)!!
  242.  
  243. /* Returns the value (true) if the key is in the Dictionary. */
  244. Def  in(self, key | assoc)
  245. {
  246.   assoc := assocAt(self, key);
  247.   if assoc
  248.     ^assoc.value;
  249.   else
  250.     ^false;
  251.   endif;
  252. }!!
  253.  
  254. now(Object)!!
  255. /* This method overrides the default case of objects not being
  256.    storable so that Project, Milestone, Task etc are all storable.
  257. */
  258. Def notStorable(self)
  259. {
  260.   ^nil;
  261. }!!
  262.